Option Explicit

'################################################################
' Descriptor
' 基于 sheet 对象的 logger 对象
'################################################################

'################################################################
' Field
'################################################################

Private curWriteNo As Long
Private sh As Worksheet
Private wb As Workbook

'################################################################
' Function
'################################################################
' 使用 sheet 对象来初始化
' @param targetSh 用来写入日志的 sheet 对象
' @optinal-param needClear 是否需要清空 sheet，默认值=true
Public Sub Init(ByRef targetSh As Worksheet, Optional ByRef needClear As Boolean = True)
    If targetSh Is Nothing Then
        Err.Raise 10001, Description:="SheetLogger#Init: parameter [targetSh] must be not nothing"
    End If

    Set sh = targetSh

    If needClear Then
        UtilsWorksheet.clearAllAndToText sh
        curWriteNo = 1
    Else
        ' 如果不清空，则将输出行号定位到已使用的最后一行的下一行
        curWriteNo = UtilsWorksheet.getUsedRangeEndRowNo(ThisWorkbook.ActiveSheet) + 1
    End If

End Sub

' 使用 workbook 对象 + sheet 名称来初始化
' 如果 workbook 对象中没有指定名称的 sheet，则主动创建
' @param targetWb 用来写入日志的 Workbook 对象
' @param sheetName 用来写入日志的 sheet 名称
' @optinal-param needClear 是否需要清空 sheet，默认值=true
Public Sub InitBySheetName(ByRef targetWb As Workbook, ByRef sheetName As String, Optional ByRef needClear As Boolean = True)
    If targetWb Is Nothing Then
        Err.Raise 10001, Description:="SheetLogger#InitBySheetName: parameter [wbtargetWb] must be not nothing"
    End If

    Set wb = targetWb

    ' 检查，如果 sheet 名称不存在，则创建一个 sheet 对象
    If Not UtilsWorkbook.hasSheet(targetWb, sheetName) Then
        Init UtilsWorkbook.addLastSheet(targetWb, sheetName), needClear
    Else
        Init targetWb.Sheets(sheetName), needClear
    End If
End Sub

'################################################################
' Function
'################################################################
' 输出 info log
' @param log 日志内容
Public Sub info(ByRef log As String)
    writeLog "INFO", log
End Sub

' 输出 error log
' @param log 日志内容
Public Sub error(ByRef log As String)
    writeLog "ERROR", log
End Sub

' 输出 warn log
' @param log 日志内容
Public Sub warn(ByRef log As String)
    writeLog "WARN", log
End Sub

' 输出log，A列为log级别，B类为log内容
' @param level 日志级别
' @param log 日志内容
Public Sub writeLog(ByRef level As String, ByRef log As String)
    ' write log
    With sh
        .Cells(curWriteNo, 1).Value = "[" & level & "]:"
        .Cells(curWriteNo, 2).Value = log

        curWriteNo = curWriteNo + 1
    End With
End Sub

'' 激活 log 的 Worksheet
'Private Sub activateLogSheet()
'    curWb.Activate
'    sh.Activate
'End Sub
